package com.example.mvvmtemplate.utli.gson;

import com.example.mvvmtemplate.base.json.JsonDataCallback;
import com.example.mvvmtemplate.utli.log.PrintLog;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

public class GsonUtil {

    /**
     * 解析json返回对象
     */
    public static <T> T fromJson(String json, Class<T> classOfT) {
        PrintLog.printJson("PrintLog", json, "解析对象");
        Gson gson = new Gson();
        return gson.fromJson(json, classOfT);
    }

    /**
     * 解析json返回泛型对象
     */
    public static <T> JsonDataCallback<T> fromGenericsJson(String json, Class<T> classOfT) {
        Gson gson = new Gson();
        Type type = new ParameterizedTypeImpl<>(JsonDataCallback.class, new Class[]{classOfT});
        return gson.fromJson(json, type);
    }

    /**
     * 解析json返回对象集合
     */
    public static <E> List<E> fromJsonList(String json) {
        PrintLog.printJson("PrintLog", json, "解析对象集合");
        Gson gson = new Gson();
        Type type = new TypeToken<List<E>>() {
        }.getType();
        return gson.fromJson(json, type);
    }

    /**
     * 解析json返回对象集合
     */
    public static <K, V> Map<K, V> fromJsonMap(String json) {
        PrintLog.printJson("PrintLog", json, "解析对象集合");
        Gson gson = new Gson();
        Type type = new TypeToken<Map<K, V>>() {
        }.getType();
        return gson.fromJson(json, type);
    }

    /**
     * 生成json
     */
    public static String toJson(Object src) {
        Gson gson = new Gson();
        return gson.toJson(src);
    }
}
